<!-- HTML header for doxygen 1.8.13-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.14"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Taskflow Handbook</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  $(document).ready(initResizable);
/* @license-end */</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname"><a href="https://taskflow.github.io/">Taskflow</a>
   &#160;<span id="projectnumber">3.0.0-Master-Branch</span>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('release-3-0-0.html','');});
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">Release 3.0.0 (Master) </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>Taskflow 3.0.0 is the newest developing line to new features and improvements we continue to support. It is also where this documentation is generated. Many things are considered <em>experimental</em> and may change or break from time to time. While it may be difficult to be keep all things consistent when introducing new features, we continue to try our best to ensure backward compatibility.</p>
<p>Starting from v3, we have migrated the codebase to the <a href="https://en.wikipedia.org/wiki/C%2B%2B17">C++17</a> standard with improved expressivity and efficiency.</p>
<h1><a class="anchor" id="release-3-0-0_download"></a>
Download</h1>
<p>To download the newest version of Taskflow, please clone from <a href="https://github.com/taskflow/taskflow">Taskflow's GitHub</a>.</p>
<h1><a class="anchor" id="release-3-0-0_system_requirements"></a>
System Requirements</h1>
<p>To use Taskflow v3.0.0, you need a compiler that supports C++17:</p>
<ul>
<li>GNU C++ Compiler at least v7.0 with -std=c++17 </li>
<li>Clang C++ Compiler at least v6.0 with -std=c++17 </li>
<li>Microsoft Visual Studio at least v15.7 (MSVC++ 19.14) </li>
<li>AppleClang Xode Version at least v12.0 with -std=c++17 </li>
<li>Nvidia CUDA Toolkit and Compiler (nvcc) at least v11.1 with -std=c++17</li>
</ul>
<p>Taskflow works on Linux, Windows, and Mac OS X.</p>
<h1><a class="anchor" id="release-3-0-0_working_items"></a>
Working Items</h1>
<ul>
<li>enhancing the taskflow profiler (<a href="https://github.com/taskflow/tfprof">TFProf</a>) </li>
<li>adding parallel sort tf::Taskflow::sort algorithms </li>
<li>adding methods for updating <a class="el" href="classtf_1_1cudaFlow.html" title="class for building a CUDA task dependency graph ">tf::cudaFlow</a> (with unittests) </li>
<li>adding support for <a href="https://docs.nvidia.com/cuda/cublas/index.html">cuBLAS</a> </li>
<li>adding support for <a href="https://developer.nvidia.com/cudnn">cuDNN</a> </li>
<li>adding support for SYCL (ComputeCpp and DPC++)</li>
</ul>
<h1><a class="anchor" id="release-3-0-0_new_features"></a>
New Features</h1>
<ul>
<li>replaced all non-standard libraries with C++17 STL (e.g., <a href="https://en.cppreference.com/w/cpp/utility/optional">std::optional</a>, <a href="https://en.cppreference.com/w/cpp/utility/variant">std::variant</a>) </li>
<li>added utility functions to grab the cuda device properties (see <a class="el" href="cuda__device_8hpp.html">cuda_device.hpp</a>) </li>
<li>added utility functions to control cuda memory (see <a class="el" href="cuda__memory_8hpp.html">cuda_memory.hpp</a>) </li>
<li>added per-thread pool for CUDA streams to improve performance </li>
<li>added a new interface <a class="el" href="classtf_1_1cudaFlowCapturer.html" title="class for building a CUDA task dependency graph through stream capture ">tf::cudaFlowCapturer</a> for building a GPU task graph through stream capture <div class="fragment"><div class="line"><a class="code" href="classtf_1_1Task.html">tf::Task</a> task = taskflow.emplace([&amp;](<a class="code" href="classtf_1_1cudaFlowCapturer.html">tf::cudaFlowCapturer</a>&amp; capturer){</div><div class="line">  <span class="comment">// capture my_kernel_1</span></div><div class="line">  <a class="code" href="classtf_1_1cudaTask.html">tf::cudaTask</a> task_1 = capturer.<a class="code" href="classtf_1_1cudaFlowCapturerBase.html#adf651356def71f613c589c29588398c2">on</a>([&amp;](cudaStream_t stream){  <span class="comment">// stream is managed by the capturer</span></div><div class="line">    my_kernel_1&lt;&lt;&lt;grid_1, block_1, shm_size_1, stream&gt;&gt;&gt;(my_parameters_1);</div><div class="line">  });</div><div class="line"></div><div class="line">  <span class="comment">// capture my_kernel_2</span></div><div class="line">  <a class="code" href="classtf_1_1cudaTask.html">tf::cudaTask</a> task_2 = capturer.<a class="code" href="classtf_1_1cudaFlowCapturerBase.html#adf651356def71f613c589c29588398c2">on</a>([&amp;](cudaStream_t stream){  <span class="comment">// stream is managed by the capturer</span></div><div class="line">    my_kernel_2&lt;&lt;&lt;grid_2, block_2, shm_size_2, stream&gt;&gt;&gt;(my_parameters_2);</div><div class="line">  });</div><div class="line"></div><div class="line">  <span class="comment">// my_kernel_1 runs before my_kernel_2</span></div><div class="line">  task_1.<a class="code" href="classtf_1_1cudaTask.html#abdd68287ec4dff4216af34d1db44d1b4">precede</a>(task_2);</div><div class="line">});</div></div><!-- fragment --> </li>
<li>added a new interface <a class="el" href="classtf_1_1cudaFlow.html#a89c389fff64a16e5dd8c60875d3b514d" title="constructs a subflow graph through tf::cudaFlowCapturer ">tf::cudaFlow::capture</a> for capturing a CUDA task graph within a parent cudaFlow <div class="fragment"><div class="line"><a class="code" href="classtf_1_1Task.html">tf::Task</a> task = taskflow.emplace([&amp;](<a class="code" href="classtf_1_1cudaFlow.html">tf::cudaFlow</a>&amp; cf){</div><div class="line">  <a class="code" href="classtf_1_1cudaTask.html">tf::cudaTask</a> capture_task = cf.<a class="code" href="classtf_1_1cudaFlow.html#a89c389fff64a16e5dd8c60875d3b514d">capture</a>([&amp;](<a class="code" href="classtf_1_1cudaFlowCapturer.html">tf::cudaFlowCapturer</a>&amp; capturer){</div><div class="line">    capturer.<a class="code" href="classtf_1_1cudaFlowCapturerBase.html#adf651356def71f613c589c29588398c2">on</a>([&amp;](cudaStream_t stream){  <span class="comment">// stream is managed by the capturer</span></div><div class="line">      my_kernel_2&lt;&lt;&lt;grid_2, block_2, shm_size_2, stream&gt;&gt;&gt;(my_parameters_2);</div><div class="line">    });</div><div class="line">  });</div><div class="line">});</div></div><!-- fragment --> </li>
<li>added a new method <a class="el" href="classtf_1_1FlowBuilder.html#afdf47fd1a358fb64f8c1b89e2a393169" title="creates a cudaflow task on the given device ">tf::Taskflow::emplace_on</a> to place a cudaFlow (<a class="el" href="classtf_1_1cudaFlow.html" title="class for building a CUDA task dependency graph ">tf::cudaFlow</a> and <a class="el" href="classtf_1_1cudaFlowCapturer.html" title="class for building a CUDA task dependency graph through stream capture ">tf::cudaFlowCapturer</a>) on the given device context <div class="fragment"><div class="line"><a class="code" href="classtf_1_1Task.html">tf::Task</a> task = taskflow.emplace_on([&amp;](<a class="code" href="classtf_1_1cudaFlow.html">tf::cudaFlow</a>&amp; cf){</div><div class="line">  <span class="comment">// the cudaFlow cf runs on GPU 1</span></div><div class="line">}, 1);</div></div><!-- fragment --></li>
</ul>
<ul>
<li>supported recursive dump of a cudaFlow with child graphs </li>
<li>supported updating a cudaFlow through <a class="el" href="classtf_1_1cudaFlow.html#a85789ed8a1f47704cf1f1a2b98969444" title="offloads the cudaFlow and executes it once ">tf::cudaFlow::offload</a> (see <a class="el" href="chapter6.html#C6_OffloadAcudaFlow">Offload a cudaFlow</a>) </li>
<li>supported iterating a cudaFlow through <a class="el" href="classtf_1_1cudaFlow.html#aea77b710bf74fb3ccc6043592d4cdbc7" title="offloads the cudaFlow with the given stop predicate and then joins the execution ">tf::cudaFlow::join_until</a> (see <a class="el" href="chapter6.html#C6_JoinAcudaFlow">Join a cudaFlow</a>)</li>
</ul>
<h1><a class="anchor" id="release-3-0-0_documentation"></a>
Documentation</h1>
<ul>
<li>added <a class="el" href="chapter7.html">C7: GPU Tasking (cudaFlowCapturer)</a> </li>
<li>added <a class="el" href="GPUAlgorithms.html">GPU Algorithms</a><ul>
<li><a class="el" href="SingleTaskCUDA.html">Single Task (cudaFlow)</a> to run a kernel function in just a single thread</li>
<li><a class="el" href="ForEachCUDA.html">Parallel Iterations (cudaFlow)</a> to perform parallel iterations over a range</li>
<li><a class="el" href="ParallelTransformsCUDA.html">Parallel Transforms (cudaFlow)</a> to perform parallel transforms over a range </li>
</ul>
</li>
<li>added <a class="el" href="Governance.html">Governance</a><ul>
<li><a class="el" href="rules.html">Rules</a></li>
<li><a class="el" href="team.html">Team</a></li>
<li><a class="el" href="codeofconduct.html">Code of Conduct</a> </li>
</ul>
</li>
<li>added <a class="el" href="Contributing.html">Contributing</a><ul>
<li><a class="el" href="guidelines.html">Guidelines</a></li>
<li><a class="el" href="contributors.html">Contributors</a> </li>
</ul>
</li>
<li>improved documentation pages for files</li>
</ul>
<h1><a class="anchor" id="release-3-0-0_bug_fixes"></a>
Bug Fixes</h1>
<ul>
<li>fixed a bug in stream capturing (need to use <code>ThreadLocal</code> mode)</li>
</ul>
<h1><a class="anchor" id="release-3-0-0_deprecated_items"></a>
Deprecated and Removed Items</h1>
<ul>
<li>removed tf::cudaFlow::device; users may call <a class="el" href="classtf_1_1FlowBuilder.html#afdf47fd1a358fb64f8c1b89e2a393169" title="creates a cudaflow task on the given device ">tf::Taskflow::emplace_on</a> to associate a cudaflow with a GPU device</li>
</ul>
<h1><a class="anchor" id="release-3-0-0_miscellaneous_items"></a>
Miscellaneous Items</h1>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="Releases.html">Releases</a></li>
    <li class="footer">Generated by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.14 </li>
  </ul>
</div>
</body>
</html>
